曾經有人統計過,一個 Programmer 工作中,佔比最重的事情是什麼,為變數取名字佔了 50%!取名字真的是一見開發過程中最難的事情。而如果一次要取大量的資料名稱呢?
Racket 當然也支援主流語言常見的 HashTable 型態,如果各位有寫過像 Scala 或一些具有 FP 特性的語言,在碰到這類的資料結構時,大概會有一個直覺反應:這是可變的(mutable),還是不可變的(immutable)?
不管是 List、Pair、Vector、HashTable,在 FP 語言裡,大多是建議你用不可變的機制來操作,因此我們先介紹不可變的 HashTable:
(define h (hash 'a "apple" 'g "grape"))
(hash-ref h 'a) ;; "apple"
在 Racket 語言裡,對資料結構進行存取,都會預設有一個 -ref
函式,不管是在 List、Vector,當然 Pair 這類簡單的結構例外。因此 hash-ref
是存取 HashTable 的,vector-ref
是存取 Vector 的。而 hash
函式,如同 vector
與 list
一樣,透過它可以建立一個不可變的資料結構。因為 HashTable 是一種 Key-Value pair 的結構,hash
後頭的參數必須是偶數個,以 key1 value1 key2 value2 ... 這樣的規則排列。
而若是要建立可變的 HashTable,還記得 Vector 有個 make-vector
嗎?HashTable 也有個 make-hash
:
(define h2 (make-hash))
(hash-set! h2 'a "apple")
(hash-set! h2 'g "graple")
(hash-ref h2 'a) ;; "apple"
然而,進一步的資料操作可以參考 Racket Guide [1]